/**
 * 返回当前时间
 */
export const formatTime = (): {
    str: string;
    Month: number;
    year: number;
    h: number;
    day: number;
    m: string | number;
} => {
    const date: Date = new Date();
    const year = date.getFullYear();
    const Month = date.getMonth() + 1;
    const day = date.getDate();
    const str = "星期" + "日一二三四五六".charAt(date.getDay());
    const h = date.getHours();
    const m =
        date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
    return {
        year,
        Month,
        day,
        str,
        h,
        m,
    };
};

/**
 * 打乱数组顺序
 * @return 新数组
 */
type Item = {
    e_name: string;
    icon: string;
    id: number;
    name: string;
    type: number;
};
export const shuffleArray = (array: Item[]) => {
    for (let i = array.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
};

/**
 * 获取本地文件
 * @param name // 文件名 如 doc.png
 * @returns {*|string}
 */
export function getAssetsFile(name: string): any | string {
    return new URL(`/src/assets/${name}`, import.meta.url).href;
}


/**
 * 函数防抖
 * @param fn 要防抖的函数
 * @param time 防抖时间
 * @returns 带有防抖功能的函数
 */
export const debounce = <T extends (...args: any[]) => any>(fn: T, time: number) => {
    let timer: NodeJS.Timeout | null = null;
    return (...args: Parameters<T>) => {
        const context = this;
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            fn.call(context, ...args);
        }, time);
    };
};

/**
 * 函数节流
 * @param fn 要节流的函数
 * @param time 节流时间
 * @returns 带有节流功能的函数
 */
export const throttle = <T extends (...args: any[]) => any>(fn: T, time: number) => {
    let activeTime: number | null = null;
    return (...args: Parameters<T>) => {
        const context = this;
        const current = Date.now();
        if (!activeTime || current - activeTime >= time) {
            fn.call(context, ...args);
            activeTime = current;
        }
    };
};

/**
 * 计算颜色的亮度并四舍五入为整数
 * 亮度可以通过以下公式计算：Brightness = 0.299 × Red + 0.587 × Green + 0.114 × Blue
 * @param color RGB颜色数组，包含红、绿、蓝三个分量
 * @returns 亮度值，四舍五入为整数
 */
export function calculateBrightness(color: [number, number, number]): number {
    // 通过给定的 RGB 值计算亮度，然后四舍五入为整数
    return Math.round(0.299 * color[0] + 0.587 * color[1] + 0.114 * color[2]);
}

/**
 * 查找给定颜色数组中最深和最浅的颜色
 * @param colors 颜色数组，包含多个 RGB 颜色值
 * @returns 包含最深和最浅颜色的对象
 */
export function findDeepestAndLightest(colors: [number, number, number][])
    : { deepestColor: [number, number, number], lightestColor: [number, number, number] } {
    // 初始化最深和最浅颜色
    let deepestColor: [number, number, number] = colors[0];
    let lightestColor: [number, number, number] = colors[0];
    // 初始化最深和最浅颜色的亮度
    let deepestBrightness: number = calculateBrightness(colors[0]);
    let lightestBrightness: number = calculateBrightness(colors[0]);
    // 遍历颜色数组，找到最深和最浅颜色
    for (let i = 1; i < colors.length; i++) {
        let brightness: number = Math.round(calculateBrightness(colors[i]))
        // 如果当前颜色的亮度比最深的还深，更新最深颜色和亮度值
        if (brightness < deepestBrightness) {
            deepestColor = colors[i];
            deepestBrightness = brightness;
        }
        // 如果当前颜色的亮度比最浅的还浅，更新最浅颜色和亮度值
        if (brightness > lightestBrightness) {
            lightestColor = colors[i];
            lightestBrightness = brightness;
        }
    }
    // 返回最深和最浅颜色
    return {
        deepestColor: deepestColor,
        lightestColor: lightestColor
    };
}

/**
 * 下载指定 URL 的文件。
 * @param url 要下载文件的 URL。
 */
export function downloadFile(url: string): void {
    // 创建一个 <a> 元素
    const link = document.createElement('a');
    // 设置 <a> 元素的 href 属性为文件的 URL
    link.href = url;
    link.target = "_blank"; // 针对 ie模式 的浏览器
    // 设置下载文件的文件名
    link.setAttribute('download', 'downloaded_file');
    // 将 <a> 元素添加到 DOM 中
    document.body.appendChild(link);
    // 模拟点击 <a> 元素以触发下载
    link.click();
    // 移除 <a> 元素
    document.body.removeChild(link);
}
